package com.kele.dao;

import com.kele.domain.Follow;
import com.kele.domain.User;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserDao {
    /**
     * 一、用户模块
     */

    /**
     * 用户注册
     * @param user
     * @return
     */
    int insertUser(User user);

    /**
     * 用户登录
     * @param account
     * @param password
     * @return
     */
    User loginUser(@Param("account") String account,
                   @Param("password") String password);

    /**
     * 用户注销
     */
    void deleteAccount(@Param("id") Integer id,
                       @Param("password")String password);

    /**
     * 用户修改密码
     * @param id
     * @param password
     * @return
     */
    int updateUserPassword(@Param("id") Integer id,
                           @Param("password")String password);


    /**
     * 通过用户名查询密码
     * @param account
     * @return
     */
    String queryPasswordByAccount(String account);

    /**
     * 用户修改信息 或者管理员修改用户资料（账号除外）
     * @param user
     * @return
     */
    int updateUser(User user);


    /**
     * 二、管理员模块
     */

    /**
     * 查询所有用户
     * @return
     */
    List<User> findAll(@Param("pageNum") int pageNum, @Param("dataNums") int dataNums);

    /**
     * 根据用户名查询用户是否存在
     * @param account
     * @return
     */
     User checkAccount(String account);

    /**
     * 管理员添加用户
     * @param user
     * @return
     */
    User addUser(User user);

    /**
     *  管理员删除用户
     * @param id
     * @return
     */
    int deleteUser(Integer id);

    /**
     * 根据邮箱查询用户
     * @param email
     * @return
     */
    User queryUserByEmail(String email);

    /**
     * 根据邮箱修改密码
     * @param email
     * @return
     */
    Integer updatePasswordByEmail(@Param("email") String email,
                                  @Param("password")String password);


    /**
     * 根据用户id查询用户
     * @param id
     * @return
     */
    User queryUserById(Integer id);

    /**
     * 通过用户名查询用户
     * @param account
     * @return
     */
    User queryByAccount(String account);

    /**
     *
     * @param id
     * @return
     */
    int addFans(int id);

    /**
     *
     * @param id
     * @return
     */
    int subFans(int id);

    /**
     *
     * @param id
     * @return
     */
    int addFollow(int id);

    /**
     *
     * @param id
     * @return
     */
    int subFollow(int id);

    /**
     * 查找表中的数据之和
     * @param table 表名
     * @return 一个数据，表示所有的数据量
     */
    int findAllSize(@Param("table") String table,@Param("flag") int flag);

    /**
     * 验证用户的昵称是否唯一
     * @param nickName 昵称
     * @return 返回 一个数字，如果>=1则表示　存在重复昵称
     */
    int checkNickName(String nickName);

    /**
     * 批量删除用户
     * @param ids
     * @return
     */
    int deleteList(Integer[] ids);

    /**
     * 完成支付后设置vip时长及更改vip状态
     * @param paytime
     * @param vip
     * @return
     */
    int setVip(@Param("id")Integer id,
               @Param("paytime")String paytime,
               @Param("vip")int vip);


    /**
     * 找出一个用户的所有粉丝
     * @param userid 用户的id
     * @return 返回一个集合，该集合包含着该用户的所有的关注对象
     */
    List<User> selectAllFollow(Integer userid);

    /**
     * 找到自己的所有粉丝
     * @param bloggerId 自己的id
     * @return 返回一个包含这所有粉丝的集合的列表
     */
    List<User> selectAllFollows(Integer bloggerId);

    /**
     * 后台管理用户模糊查询(根据属性)
     * @return
     */
    List<User> fuzzy(String attribute);

}
